/**
 * Created by xw on 20/03/21.
 */

export function isvalidUsername(str) {
  const valid_map = ['admin', 'editor']
  return valid_map.indexOf(str.trim()) >= 0
}

/* 合法uri*/
export function validateURL(textval) {
  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return urlregex.test(textval)
}

/* 小写字母*/
export function validateLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

/* 大写字母*/
export function validateUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/* 大小写字母*/
export function validateAlphabets(str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}
// 小数点 后面保留3位小数
export function validateRatioEndWithThree(str) {
  const reg = /^[0-9]*\.?[0-9]{0,3}$/g
  return reg.test(str)
}

// 输入密码
export function validatePass(rule, value, callback) {
  if (value === '') {
    callback(new Error('请输入密码'));
  } else {
    callback();
  }
}
// 两次密码验证
export function validatePass2(rule, value, callback) {
  if (value === '') {
    callback(new Error('请再次输入密码'))
  } else if (value !== this.temp.newPassword) {
    callback(new Error('两次输入密码不一致!'))
  } else {
    callback();
  }
}
// 验证手机号
export function checkPhone(rule, value, callback) {
  function isPoneAvailable(str) {
    const myreg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/
    const myreg1 = /^((0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/
    const myreg2 = /^\d{7,8}$/
    if (!myreg.test(str) && !myreg1.test(str)) {
      if (myreg2.test(str)) {
        return 'ADD'
      } else {
        return false
      }
    } else {
      return true
    }
  }
  if (!(value)) {
    callback(new Error('电话不能为空'))
  } else if (isPoneAvailable(value) === 'ADD') {
    callback(new Error('请添加区号; 形如:XXX-XXXXXXX'))
  } else if (isPoneAvailable(value)) {
    callback()
  } else {
    callback(new Error('非法电话'))
  }
}

// 验证中文名字
export function regName(rule, value, callback) {
  const nameReg = /^[\u4E00-\u9FA5]{2,4}$/g
  if (value === '' || value === null) {
    callback(new Error('姓名不能为空'))
  } else if (!nameReg.test(value)) {
    callback(new Error('非法姓名'))
  } else {
    callback()
  }
}

// 验证19位银行卡号
export function regBlank(rule, value, callback) {
  const blankReg = /^\d{19}$/g
  if (value === '' || value === null) {
    callback(new Error('银行卡号不能为空'))
  } else if (!blankReg.test(value)) {
    callback(new Error('非法银行卡号'))
  } else {
    callback()
  }
}

/*
*校验地址码
*/
function checkAddressCode(addressCode) {
  const provinceAndCitys = { 11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江',
    31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东', 41: '河南', 42: '湖北', 43: '湖南', 44: '广东',
    45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏',
    65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外' }
  const check = /^[1-9]\d{5}$/.test(addressCode)
  if (!check) return false
  if (provinceAndCitys[parseInt(addressCode.substring(0, 2))]) {
    return true
  } else {
    return false
  }
}

/**
 *验证组织机构代码是否合法：组织机构代码为8位数字或者拉丁字母+1位校验码。
 *验证最后那位校验码是否与根据公式计算的结果相符。
 */
function isValidOrgCode(value) {
  if (value !== '') {
    const part1 = value.substring(0, 8)
    const part2 = value.substring(value.length - 1, 1)
    const ws = [3, 7, 9, 10, 5, 8, 4, 2]
    const str = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    const reg = /^([0-9A-Z]){8}$/
    if (!reg.test(part1)) {
      return true
    }
    let sum = 0
    for (let i = 0; i < 8; i++) {
      sum += str.indexOf(part1.charAt(i)) * ws[i]
    }
    let C9 = 11 - (sum % 11)
    const YC9 = part2 + ''
    if (C9 === 11) {
      C9 = '0'
    } else if (C9 === 10) {
      C9 = 'X'
    } else {
      C9 = C9 + ''
    }
    return YC9 !== C9
  }
}

/*
  * 纳税人识别号验证
  * 15位包括地区编码6位+组织机构代码9位
  */
function checkTaxpayerId_temp(taxpayerId) {
  if (!taxpayerId) {
    return false
  }
  taxpayerId = taxpayerId.toString()
  if (taxpayerId !== '' && taxpayerId.length === 15) {
    var addressCode = taxpayerId.substring(0, 6)
    // 校验地址码
    var check = checkAddressCode(addressCode)
    if (!check) {
      return false
    }
    // 校验组织机构代码
    var orgCode = taxpayerId.substring(6, 9)
    check = isValidOrgCode(orgCode)
    if (!check) {
      return false
    }
    return true
  } else {
    return false
  }
}

// 18位统一社会信用编码校验
function CheckSocialCreditCodeOrg(Code) {
  if (!Code) {
    return false
  }
  const patrn = /^[0-9A-Z]+$/
  // 18位校验及大写校验
  if ((Code.length !== 18) || (patrn.test(Code) === false)) {
    return false
  } else {
    let Ancode// 信用代码/税号的每一个值
    let Ancodevalue// 信用代码/税号每一个值的权重
    let total = 0
    const weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28] // 加权因子
    const str = '0123456789ABCDEFGHJKLMNPQRTUWXY'
    // 不用I、O、S、V、Z
    for (let i = 0; i < Code.length - 1; i++) {
      Ancode = Code.substring(i, i + 1)
      Ancodevalue = str.indexOf(Ancode)
      total = total + Ancodevalue * weightedfactors[i]
      // 权重与加权因子相乘之和
    }
    let logiccheckcode = 31 - total % 31
    if (logiccheckcode === 31) {
      logiccheckcode = 0
    }
    const Str = '0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y'
    const Array_Str = Str.split(',')
    logiccheckcode = Array_Str[logiccheckcode]
    const checkcode = Code.substring(17, 18)
    if (logiccheckcode !== checkcode) {
      return false
    } else {
      return true
    }
  }
}

// 验证纳税人识别号
export function checkCreditNo(rule, value, callback) {
  if (value === '' || value === null) {
    callback(new Error('请输入纳税人识别号'))
  } else if (checkTaxpayerId_temp(value) || CheckSocialCreditCodeOrg(value)) {
    callback()
  } else {
    callback(new Error('非法纳税人识别号'))
  }
}

// 验证非负数字
export function nonNegativeNumber(rule, value, callback) {
  const reg = /\s|^\d+(\.\d+)?$/
  console.log('value', value)
  if (reg.test(value) || value === null) {
    callback()
  } else {
    callback(new Error('非法数字'))
  }
}

// 验证正整数
export function regU(rule, value, callback) {
  const reg = /^[1-9]\d*$/
  if (reg.test(value) || value === null) {
    callback()
  } else {
    callback(new Error('非法数字'))
  }
}

// 验证正整数 范围(0-9999)
export function regNum(rule, value, callback) {
  const reg = /^[1-9]\d{0,3}$/
  if (reg.test(value) || value === null) {
    callback()
  } else {
    callback(new Error('非法数字或超过限制(0~9999)'))
  }
}

// 验证正整数 范围(0-100)
export function regOneHundredNum(rule, value, callback) {
  const new_value = +parseFloat(value).toFixed(2)
  if (new_value <= 100 && new_value >= 0) {
    callback()
  } else {
    callback(new Error('非法数字或超过限制(0~100)'))
  }
}

// 验证正数 范围(0-1)
export function regOneNum(rule, value, callback) {
  const new_value = +parseFloat(value).toFixed(2)
  if (new_value <= 1 && new_value >= 0) {
    callback()
  } else {
    callback(new Error('非法数字或超过限制(0~1)'))
  }
}

// 非必填手机号验证
export function nonRequiredphone(rule, value, callback) {
  function isPoneAvailable(str) {
    const myreg = /^[1][3,4,5,7,8,9][0-9]{9}$/
    const myreg1 = /^((0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/
    const myreg2 = /^\d{7,8}$/
    if (!myreg.test(str) && !myreg1.test(str)) {
      if (myreg2.test(str)) {
        return 'ADD'
      } else {
        return false
      }
    } else {
      return true
    }
  }
  if (value === '' || value === null) {
    callback()
  } else if (isPoneAvailable(value) === 'ADD') {
    callback(new Error('请添加区号; 形如:XXX-XXXXXXX'))
  } else if (isPoneAvailable(value)) {
    callback()
  } else {
    callback(new Error('非法电话'))
  }
}

// 车牌号校验 表单验证
export function regPlate(rule, value, callback) {
  const reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/
  if (reg.test(value)) {
    callback()
  } else if (value === '' || value === null) {
    callback(new Error('请输入车牌号'))
  } else {
    callback(new Error('非法车牌号'))
  }
}

// 挂车车牌校验, 末端必须带挂字
export function regTrailerPlateFilter(rule, value, callback) {
  const reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[挂]{1}$/
  if (reg.test(value)) {
    callback()
  } else if (value === '' || value === null) {
    callback(new Error('请输入车牌号, 末端带"挂"字'))
  } else {
    callback(new Error('非法车牌号'))
  }
}

// 非必填车牌号校验
export function regPlateNonEssential(rule, value, callback) {
  const reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/
  if (reg.test(value) || value === '' || value === null) {
    callback()
  } else {
    callback(new Error('非法车牌号'))
  }
}

// 校验数字规则, 保留小数点后8位
export function validateFloat(rule, value, callback) {
  const numberReg = new RegExp('^(([1-9]\\d*)|0)(\\.\\d{1,8})?$')
  if (value) {
    if (!numberReg.test(value)) {
      callback(new Error('请输入数字值, 且小数点最后8位'))
    } else {
      callback()
    }
  } else {
    callback()
  }
}

// 校验数字规则, 保留小数点后2位
export function validateRatio(rule, value, callback) {
  const numberReg = new RegExp('^\\d{1,3}$|^\\d{1,3}[.]\\d{1,2}$')
  if (!numberReg.test(value)) {
    callback(new Error('请输入数字值, 整数最多3位, 且小数点最后2位'))
  } else {
    callback()
  }
}

// 校验数字规则, 保留小数点后4位
export function validateRatioEndWithFour(rule, value, callback) {
  const numberReg = new RegExp('^\\d{1,3}$|^\\d{1,3}[.]\\d{1,4}$')
  if (!numberReg.test(value)) {
    callback(new Error('请输入数字值, 整数最多3位, 且小数点最后4位'))
  } else {
    callback()
  }
}

// 校验数字规则, 保留小数点后4位
export function validateMoneyWithFour(rule, value, callback) {
  if (value) {
    const numberReg = new RegExp('^\\d{1,10}$|^\\d{1,10}[.]\\d{1,4}$')
    if (!numberReg.test(value)) {
      callback(new Error('请输入数字值, 整数最多10位, 且小数点最后4位'))
    } else {
      callback()
    }
  } else {
    callback()
  }
}

// 校验数字规则, 保留小数点后2位
export function validateMoney(rule, value, callback) {
  if (value) {
    const numberReg = new RegExp('^\\d{1,10}$|^\\d{1,10}[.]\\d{1,2}$')
    if (!numberReg.test(value)) {
      callback(new Error('请输入数字值, 整数最多10位, 且小数点最后2位'))
    } else {
      callback()
    }
  } else {
    callback()
  }
}

// 0-1的小数
export function validateZeroAndOneRate(rule, value, callback) {
  const numberReg = new RegExp('^0$|^1$|^0[.][1-9]{0,2}$')
  if (value) {
    if (!numberReg.test(value)) {
      callback(new Error('请输入0到1的数, 且小数点最后2位'))
    } else {
      callback()
    }
  } else {
    callback()
  }
}

// 校验多选 是否没选值
export function isEmptyArray(rule, value, callback) {
  console.log('isEmptyArray', value)
  if (value.length === 0) {
    callback(new Error('请选择至少一个值'))
  } else {
    callback()
  }
}

// 校验数字规则, 保留小数点后5位
export function validateTenAndFiveMoney(rule, value, callback) {
  if (value) {
    const numberReg = new RegExp('^\\d{1,10}$|^\\d{1,10}[.]\\d{1,5}$')
    if (!numberReg.test(value)) {
      callback(new Error('请输入数字值, 整数最多10位, 且小数点最后5位'))
    } else {
      callback()
    }
  } else {
    callback()
  }
}
